Overview
Shutter DAO 0x36 will integrate with Octant v2 through two distinct components:
SHUGrantPool Strategy
An ERC-4626 yield-donating strategy for treasury capital (no lockup)
Regen Staker
A staking contract for SHU tokens enabling public goods funding with matched rewards
| Component | Purpose | Capital |
|---|---|---|
| SHUGrantPool Strategy | Generate yield to fund Regen Staker rewards | 1.2M USDC |
| Regen Staker | Public goods funding (matched rewards) | SHU tokens |
Architecture Note: The strategy IS the ERC-4626 vault. No MultistrategyVault wrapper is needed since only one strategy is approved by the DAO. This simplifies deployment, reduces gas costs, and eliminates unnecessary complexity.
Prerequisites (Pending Items)
The following items must be resolved before executing the DAO proposal:
| Item | Status | Owner | Notes |
|---|---|---|---|
| Dragon Funding Pool address | ⏳ Pending | Octant | PaymentSplitter payee |
| Keeper Bot address | ⏳ Pending | Octant | Strategy keeper for harvesting |
⚠️ Action Required: Update this document with actual addresses once Octant completes deployment.
Verified On-Chain Addresses
| Entity | Address | Network |
|---|---|---|
| Shutter DAO Treasury | 0x36bD3044ab68f600f6d3e081056F34f2a58432c4 |
Ethereum |
| Azorius Module | 0xAA6BfA174d2f803b517026E93DBBEc1eBa26258e |
Ethereum |
| SHU Token | 0xe485E2f1bab389C08721B291f6b59780feC83Fd7 |
Ethereum |
| USDC | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 |
Ethereum |
| Morpho Strategy Factory | 0x052d20B0e0b141988bD32772C735085e45F357c1 |
Ethereum |
| Tokenized Strategy | 0xb27064A2C51b8C5b39A5Bb911AD34DB039C3aB9c |
Ethereum |
| Yearn Strategy USDC | 0x074134A2784F4F66b6ceD6f68849382990Ff3215 |
Ethereum |
| PaymentSplitter Factory | 0x5711765E0756B45224fc1FdA1B41ab344682bBcb |
Ethereum |
Part 1: SHUGrantPool Strategy
The MorphoCompounderStrategy is itself an ERC-4626 vault (via Yearn's TokenizedStrategy). Treasury deposits USDC directly into the strategy.
Underlying Yield Source
Yearn Strategy USDC — Deposits into Morpho lending markets via Yearn's aggregator vault.
Role Assignments
| Role | Assigned To | Description |
|---|---|---|
| Management | Shutter DAO Treasury (0x36bD...32c4) |
Administrative role (set keeper, set emergency admin, shutdown) |
| Keeper | Dedicated Bot/EOA | REQUIRED: Authorized to call report()/tend() to harvest yields without governance votes |
| Emergency Admin | Shutter DAO Treasury (0x36bD...32c4) |
Can shutdown the strategy and perform emergency withdrawals |
Critical: The Keeper should be a dedicated EOA or bot, NOT the Treasury Safe. Assigning Keeper to Treasury would require a governance vote for every harvest, creating severe operational bottlenecks.
Yield Distribution
| Destination | Allocation |
|---|---|
| Dragon Funding Pool | 100% |
Part 2: Regen Staker
The Regen Staker allows SHU holders to stake their tokens and direct their staking rewards toward public goods funding. Rewards are distributed from an external source (e.g., SHUGrantPool Strategy yield).
Key Features
- Public Goods Funding: Stakers allocate their rewards to projects in funding rounds
- Delegation Preserved: Stakers retain Shutter DAO voting power via delegation surrogates
How Delegation Works
- User stakes SHU tokens in the Regen Staker
- Tokens are held by a Delegation Surrogate contract (deployed deterministically via CREATE2)
- The surrogate delegates Shutter DAO voting power to the user's chosen delegatee
- User's staking rewards can be directed to public goods projects in Octant funding rounds
Shutter DAO Governance
Architecture
Shutter DAO 0x36 uses Fractal (Decent) for on-chain governance, built on Safe:
| Component | Address / Value |
|---|---|
| Safe (Treasury) | 0x36bD3044ab68f600f6d3e081056F34f2a58432c4 |
| Azorius Module | 0xAA6BfA174d2f803b517026E93DBBEc1eBa26258e |
| Voting Token | SHU (0xe485E2f1...Fd7) |
Execution Call Chain
Critical: From the target contract's perspective, msg.sender is the Safe address (0x36bD...), NOT the Azorius module. This is why all roles are assigned to the Treasury Safe address.
Governance Parameters
See current governance parameters on the Decent DAO App.
Voting Platforms
| Platform | Type | Use Case |
|---|---|---|
| Decent | On-chain | Treasury transactions, contract interactions |
| Snapshot | Off-chain | Temperature checks, non-binding polls |
Execution Playbook
Phase 1: Strategy Deployment
The entire deployment can be executed in a single DAO proposal with 1 batched MultiSend containing 4 operations:
- Deploy PaymentSplitter via Factory
- Deploy Strategy via Factory (uses precomputed PaymentSplitter address)
- Approve USDC to Strategy (uses precomputed Strategy address)
- Deposit USDC into Strategy
Key optimization: Both factories use CREATE2, allowing address precomputation. This enables batching all 4 operations without waiting for return values.
MultiSend requirement: Execute MultiSend with operation=DELEGATECALL. Using CALL makes msg.sender the MultiSend contract and will break USDC approvals.
Gas Profile
| Component | Gas Cost |
|---|---|
| DAO Proposal (1 batched call, 4 operations) | ~1.5M |
| EIP-7825 Limit | 16,777,216 |
| Headroom | >91% |
Transaction Details
Transaction 1: Deploy PaymentSplitter
Target: 0x5711765E0756B45224fc1FdA1B41ab344682bBcb
Function: createPaymentSplitter(address[],string[],uint256[])
Value: 0
Parameters:
payees: [[DRAGON_FUNDING_POOL]]
payeeNames: ["DragonFundingPool"]
shares: [100]
Transaction 2: Deploy Strategy
Target: 0x052d20B0e0b141988bD32772C735085e45F357c1 (Morpho Strategy Factory)
Function: createStrategy(string,address,address,address,address,bool,address)
Selector: 0x31d89943
Value: 0
Parameters:
_name: "SHUGrantPool"
_management: 0x36bD3044ab68f600f6d3e081056F34f2a58432c4
_keeper: [KEEPER_ADDRESS] (dedicated bot)
_emergencyAdmin: 0x36bD3044ab68f600f6d3e081056F34f2a58432c4
_donationAddress: [PAYMENT_SPLITTER_ADDRESS] (from Tx 1)
_enableBurning: false
_tokenizedStrategyAddress: 0xb27064a2c51b8c5b39a5bb911ad34db039c3ab9c
Transaction 3: Approve USDC
Target: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (USDC)
Function: approve(address,uint256)
Selector: 0x095ea7b3
Value: 0
Parameters:
spender: [STRATEGY_ADDRESS] (from Tx 2)
amount: 1200000000000 (1.2M USDC with 6 decimals)
Transaction 4: Deposit USDC
Target: [STRATEGY_ADDRESS] (from Tx 2)
Function: deposit(uint256,address)
Selector: 0x6e553f65
Value: 0
Parameters:
assets: 1200000000000 (1.2M USDC with 6 decimals)
receiver: 0x36bD3044ab68f600f6d3e081056F34f2a58432c4 (Treasury)
Generate Calldata
forge script partners/shutter_dao_0x36/script/GenerateProposalCalldata.s.sol --fork-url $ETH_RPC_URL -vvvv
Post-Deployment Operations
Harvest Operation
Target: [STRATEGY_ADDRESS]
Function: report()
Selector: 0x2606a10b
Value: 0
Calldata: 0x2606a10b
Note: Called by management or keeper to harvest yield.
Emergency Operations
Shutdown Strategy
Target: [STRATEGY_ADDRESS]
Function: shutdownStrategy()
Selector: 0xbe8f1668
Effect: Stops new deposits/mints, allows withdrawals.
Access: management or emergencyAdmin
Emergency Withdraw
Target: [STRATEGY_ADDRESS]
Function: emergencyWithdraw(uint256)
Selector: 0x5312ea8e
Parameters:
_amount: 1200000000000 (1.2M USDC - full withdrawal)
Prerequisite: Strategy must be shutdown first.
Access: management or emergencyAdmin
Quick Reference: Function Selectors
| Function | Selector | Target | Purpose |
|---|---|---|---|
createPaymentSplitter(...) | - | PaymentSplitter Factory | Deploy yield distribution |
createStrategy(...) | 0x31d89943 | Morpho Factory | Deploy strategy |
approve(address,uint256) | 0x095ea7b3 | USDC | Allow spending |
deposit(uint256,address) | 0x6e553f65 | Strategy | Deposit funds |
withdraw(uint256,address,address) | 0xb460af94 | Strategy | Withdraw funds |
report() | 0x2606a10b | Strategy | Harvest yield |
shutdownStrategy() | 0xbe8f1668 | Strategy | Emergency shutdown |
emergencyWithdraw(uint256) | 0x5312ea8e | Strategy | Emergency exit |